import { defineStore } from 'pinia';
import { ref, computed } from 'vue';
import request from '../utils/request';

export const useTodoStore = defineStore('todo', () => {
  // 状态
  const todosByProject = ref({}); // { projectId: { todos: [], currentPage: 1, total: 0 } }
  const pageSize = ref(30);
  const loading = ref({}); // { projectId: boolean }

  // 方法
  const fetchTodos = async (projectId, page = 1) => {
    if (!todosByProject.value[projectId]) {
      todosByProject.value[projectId] = {
        todos: [],
        currentPage: 1,
        total: 0,
      };
    }

    loading.value[projectId] = true;
    try {
      const response = await request({
        url: `/app/todo/todo/page`,
        method: 'POST',
        data: {
          page,
          size: pageSize.value,
          projectId: projectId
        }
      });
      todosByProject.value[projectId].todos = response.data?.list || [];
      todosByProject.value[projectId].total = response.data?.total || 0;
      todosByProject.value[projectId].currentPage = page;
    } catch (error) {
      console.error('fetchTodos_ error:', error);
    } finally {
      loading.value[projectId] = false;
    }
  };

  const addTodo = async (projectId, name) => {
    try {
      const response = await request({
        url: `/app/todo/todo/add`,
        method: 'POST',
        data: { name, projectId }
      });
      todosByProject.value[projectId].todos.unshift({
        ...response.data,
        name,
        projectId,
        status: 0,
        totalTime: 0,
      });

      todosByProject.value[projectId].total++;
    } catch (error) {
      console.error('addTodo_ error:', error);
    }
  };

  const updateTodo = async (projectId, todoId, name) => {
    try {
      await request({
        url: `/app/todo/todo/update`,
        method: 'POST',
        data: { id: todoId, name, projectId }
      });
      const todos = todosByProject.value[projectId].todos;
      const index = todos.findIndex(t => t.id === todoId);
      if (index !== -1) {
        todos[index].name = name;
      }
    } catch (error) {
      console.error('updateTodo_ error:', error);
    }
  };

  // add time
  const addTime = async (projectId, todoId, minutes) => {
    try {
      await request({
        url: `/app/todo/todo/addTime`,
        method: 'POST',
        data: { projectId, todoId, minutes }
      });
    } catch (error) {
      console.error('addTime_ error:', error);
    }
  }

  const deleteTodo = async (projectId, todoId) => {
    try {
      await request({
        url: `/app/todo/todo/delete`,
        method: 'POST',
        data: { ids: [todoId] }
      });
      todosByProject.value[projectId].todos = todosByProject.value[projectId].todos.filter(t => t.id !== todoId);
      todosByProject.value[projectId].total--;
    } catch (error) {
      console.error('deleteTodo_ error:', error);
    }
  };

  return {
    todosByProject,
    pageSize,
    loading,
    fetchTodos,
    addTodo,
    updateTodo,
    addTime,
    deleteTodo,
  };
});